<?php

namespace app\api\service;

use think\Controller;
use think\Db;
use think\Loader;
use WxpayAPI\WxPayApi;
use WxpayAPI\JsApiPay;
use WxpayAPI\WxPayUnifiedOrder;
use Des3\DES3;

class Pay extends Controller {
    /**
     * 检查支付密码是否正确
     * @param $param
     * @return array
     */
	public static function check_safe_password($param) {
		try {
            $member_id = $param['member_id'];
            // 解密数据
            $des = new DES3();
            $safe_password = $des->decrypt($param['safe_password']);

			$time = strtotime(date('Y-m-d'));
			$error_count = model('safe_password_error_log')->where('member_id', $member_id)->where('create_time', '> time', $time)->count();
			if ($error_count >= 3) {
				throw new \Exception('安全密码已锁定，请明天再试');
			}
			
			$member = model('member')->get(['id' => $member_id]);
			if (!$member['safe_password']) {
				throw new \Exception('未设置支付密码');
			}
            $safe_password .= $member['salt'];
			if (md5($safe_password) != $member['safe_password']) {
				// 增加错误记录
				$error_data = ['member_id' => $member_id];
				model('safe_password_error_log')->save($error_data);
				if ($error_count == 0) {
					throw new \Exception('支付密码第一次验证错误,还有两次机会');
				}
				if ($error_count == 1) { // 第二次错误
					throw new \Exception('支付密码第二次验证错误，还有一次机会');
				}
				if ($error_count == 2) { // 第三次错误
					throw new \Exception('支付密码第三次验证错误，安全密码被锁定');
				}
				throw new \Exception('安全密码已锁定，请明天再试');
			}
			// 验证成功 删除当天错误记录
			model('safe_password_error_log')->where('member_id', $member_id)->delete();
			return api_return(200, []);
		} catch (\Exception $e) {
            return api_return(0, [], $e->getMessage());
		}
	}

    /**
     * 检查是否设置支付密码
     * @param $param
     * @return array
     */
	public static function is_set_safe_password($param) {
		try {
			$member_safe_password = model('member')->where('id', $param['member_id'])->value('safe_password');
			if (!$member_safe_password) {
				throw new \Exception('未设置安全密码');
			}
			return api_return(200, []);
		} catch (\Exception $e) {
            return api_return(0, [], $e->getMessage());
		}
	}

    /**
     * 站内支付  支持余额和衣币
     * @param $param
     * @return array
     */
	public static function instation_pay($param) {
	    Db::startTrans();
        try {
            $model = $param['model'];
            $order = model($model)->get(['id' => $param['order_id'], 'member_id' => $param['member_id']]);

            if ($order) {
                $price = $order->price;
                if ($order->orderMember->clothes_money < $price) {
                    throw new \Exception('账户衣币不足');
                }
                model('member')->where(['id' => $param['member_id']])->setDec('clothes_money', $price);
                if ($model == 'order') {
                    $order_sn = $order->order_sn;
                    model('order')->save(['pay_type' => '衣币支付', 'pay_time' => time(), 'status' => 2], ['id' => $order->id]);
                } else if($model == 'order_after_sale') {
                    $order_sn = $order->aftermarket_sn;
                    model('order_after_sale')->save(['pay_type' => '衣币支付', 'pay_time' => time(), 'status' => 3], ['id' => $order->id]);
                } else {
                    throw new \Exception('订单类型异常');
                }
                \app\api\service\MemberBill::add_member_bill($param['member_id'], $price, '订单支付', 1, $order_sn, $model,  '衣币支付');
            } else {
                throw new \Exception('订单不存在');
            }

            if ($model == 'order') {
                // 订单支付成功 - 通知量体师
                $param = [
                    'order_id' => $order->id
                ];
                \app\api\service\PatternMaster::inform($param);
            }

            Db::commit();
            return api_return(200, []);
        } catch (\Exception $e) {
            Db::rollback();
            return api_return(0, [], $e->getMessage());
        }
    }

    /**
     * 微信web端支付信息
     * @param $order_sn
     * @param $order_price
     * @param $attach
     * @return array
     */
	public static function wx_web_pay($order_sn, $order_price, $attach)
	{
		try
		{
            $notify_url = "http://www.hnjyxh.com/index/activity/notify";
		    //throw new \Exception($notify_url);
			// ①、获取用户openid
			$tools = new JsApiPay();
			$openId = $tools->GetOpenid($order_sn);
			// ②、统一下单
			$input = new WxPayUnifiedOrder();
            $input->SetBody('长沙酒文化节订单支付');
			$input->SetAttach($attach); // 自定义参数 原样返回
			                            // $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
			$input->SetOut_trade_no($order_sn);
			// $input->SetTotal_fee(1);
			if ($order_price <= 0) {
				throw new \Exception("支付金额必须大于0");
			}
			$input->SetTotal_fee($order_price * 100);
			$input->SetTime_start(date("YmdHis"));
			$input->SetTime_expire(date("YmdHis", time() + 600));
			$input->SetGoods_tag("");
			$input->SetNotify_url($notify_url);
			$input->SetTrade_type("JSAPI");
			$input->SetOpenid($openId);
			$order = WxPayApi::unifiedOrder($input);
			// exit(json_encode($order));
			// echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
			// $this->printf_info($order);
			$jsApiParameters = $tools->GetJsApiParameters($order);
			
			// 获取共享收货地址js函数参数
			$editAddress = $tools->GetEditAddressParameters();
			
			// ③、在支持成功回调通知中处理成功之后的事宜，见 notify.php
			/**
			 * 注意： 1、当你的回调地址不可访问的时候，回调通知会失败，可以通过查询订单来确认支付是否成功 2、jsapi支付时需要填入用户openid，WxPay.JsApiPay.php中有获取openid流程 （文档可以参考微信公众平台“网页授权接口”， 参考http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html）
			 */
			
			return ['code' => 200,'jsApiParameters' => $jsApiParameters,'editAddress' => $editAddress];
		}
		catch (\Exception $e)
		{
			return ['code' => 400,'msg' => $e->getMessage()];
		}
	}

	/**
	 * 微信app端支付信息
	 * @param
	 * $param
	 * @return array
	 */
	public static function wx_app_pay($param)
	{
		try
		{
			$order_price = Db::table('mob_' . $param['model'])->where('order_sn', $param['order_sn'])->value('order_price');
			if (!$order_price)
			{
				throw new \Exception("订单不存在");
			}
			
			/**
			 * 微信支付附加数据
			 */
			
			// 优惠券信息
			$coupon = [];
			if ($param['member_coupon_id'] > 0)
			{
				$coupon = db('member_coupon')->alias('mc')->field('c.*')->join('mob_coupon c', 'c.id = mc.coupon_id')->where('mc.member_id', $param['member_id'])->where('mc.status', 0)->where('c.end_use_time', '> time', time())->where('c.start_use_time', '<= time', time())->where('mc.id', $param['member_coupon_id'])->find();
			}
			
			// 商家数据包
			$attach['model'] = $param['model'];
			$attach['mt'] = $param['member_type'];
			if ($coupon)
			{
				$order_price -= $coupon['money'];
				$attach['c'] = $param['member_coupon_id'];
				$attach['cp'] = $coupon['money'];
			}

			Loader::import('WxpayAPPAPI.WxPayData');
			$input = new \WxPayUnifiedOrder();
			$input->SetBody("开摩帮网订单支付");
			$input->SetAttach(json_encode($attach)); // 商家数据包
			                                         // $input->SetOut_trade_no(\WxPayConfig::MCHID.date("YmdHis"));//商户订单号
			$input->SetOut_trade_no($param['order_sn']);
			$input->SetTotal_fee($order_price * 100); // 金额
			                                          // $input->SetTotal_fee(1); //金额
			$input->SetTime_start(date("YmdHis"));
			$input->SetTime_expire(date("YmdHis", time() + 600));
			// $input->SetGoods_tag("test");
			$input->SetNotify_url("http://" . $_SERVER['HTTP_HOST'] . PUBLIC_URL . "wechat/pay/notify");
			$input->SetTrade_type("APP");

			// $input->SetOpenid($openId);
			Loader::import('WxpayAPPAPI.WxPayApi');
			$result = \WxPayApi::unifiedOrder($input);
			
			// ③、在支持成功回调通知中处理成功之后的事宜，见 notify.php
			/**
			 * 注意： 1、当你的回调地址不可访问的时候，回调通知会失败，可以通过查询订单来确认支付是否成功 2、jsapi支付时需要填入用户openid，WxPay.JsApiPay.php中有获取openid流程 （文档可以参考微信公众平台“网页授权接口”， 参考http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html）
			 */
			
			return ['code' => 200,'result' => $result];
		}
		catch (\Exception $e)
		{
			return ['code' => 400,'msg' => $e->getMessage()];
		}
	}

    /**
     * 博鳌酒业峰会微信web端支付信息
     * @param $order_sn
     * @param $order_price
     * @param $attach
     * @return array
     */
    public static function wx_enlist_web_pay($order_sn, $order_price, $attach)
    {
        try
        {
            $notify_url = "http://www.hnjyxh.com/index/activity/notify";
            //throw new \Exception($notify_url);
            // ①、获取用户openid
            $tools = new JsApiPay();
            $openId = $tools->GetOpenid($order_sn);
            // ②、统一下单
            $input = new WxPayUnifiedOrder();
            $input->SetBody('博鳌酒业峰会订单支付');
            $input->SetAttach($attach); // 自定义参数 原样返回
            // $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
            $input->SetOut_trade_no($order_sn);
            // $input->SetTotal_fee(1);
            if ($order_price <= 0) {
                throw new \Exception("支付金额必须大于0");
            }
            $input->SetTotal_fee($order_price * 100);
            $input->SetTime_start(date("YmdHis"));
            $input->SetTime_expire(date("YmdHis", time() + 600));
            $input->SetGoods_tag("");
            $input->SetNotify_url($notify_url);
            $input->SetTrade_type("JSAPI");
            $input->SetOpenid($openId);
            $order = WxPayApi::unifiedOrder($input);
            // exit(json_encode($order));
            // echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
            // $this->printf_info($order);
            $jsApiParameters = $tools->GetJsApiParameters($order);

            // 获取共享收货地址js函数参数
            $editAddress = $tools->GetEditAddressParameters();

            // ③、在支持成功回调通知中处理成功之后的事宜，见 notify.php
            /**
             * 注意： 1、当你的回调地址不可访问的时候，回调通知会失败，可以通过查询订单来确认支付是否成功 2、jsapi支付时需要填入用户openid，WxPay.JsApiPay.php中有获取openid流程 （文档可以参考微信公众平台“网页授权接口”， 参考http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html）
             */

            return ['code' => 200,'jsApiParameters' => $jsApiParameters,'editAddress' => $editAddress];
        }
        catch (\Exception $e)
        {
            return ['code' => 400,'msg' => $e->getMessage()];
        }
    }



    /**
     * 微信支付回调
     * @param $order_sn
     * @param $trade_no
     * @param $total_fee
     * @return bool
     */
	public static function pay_notify($order_sn, $trade_no, $total_fee)
	{
        file_put_contents('wxpay.txt', "进来了 \n", FILE_APPEND);
		Db::startTrans();
		try {
            $order_data = [
                'pay_sn' => $trade_no,
                'pay_time' => time()
            ];

            $order = db('jwh_order')->where(['order_sn' => $order_sn])->find();
            if ($order['status'] != 1) {
                return false; // 订单不是待付款状态
            }

            $min_booth = ['L15', 'L19', 'L21', 'L16'];

            if (in_array($order['number'], $min_booth)) {
                // 订单金额
                $price = 0.01;
            } else {
                // 订单金额
                $price = 1000;
            }

            if ($total_fee != $price) {
                // 订单金额不对
                return false;
            }

            // 补充订单数据
            $order_data['status'] = 2;
            Db::table('jyxh_jwh_order')->where(['order_sn' => $order_sn])->update($order_data);

			// 提交事务
			Db::commit();
			return true;
		} catch (\Exception $e) {
			// 回滚事务
			Db::rollback();
			return false;
		}
	}
    /**
     * 博鳌酒业峰会微信支付回调
     * @param $order_sn
     * @param $trade_no
     * @param $total_fee
     * @return bool
     */
    public static function enlist_pay_notify($order_sn, $trade_no, $total_fee)
    {
        file_put_contents(RUNTIME_PATH.'enlist_wxpay.txt', "进来了 \n", FILE_APPEND);
        Db::startTrans();
        try {
            $order = db('enlist')->where(['order_sn' => $order_sn])->find();
            if ($order['status'] != 0) {
                return false; // 订单不是待付款状态
            }

            // 补充订单数据
            $enlist_data['status'] = 1;

            Db::table('jyxh_enlist')->where(['order_sn' => $order_sn])->update($enlist_data);

            // 提交事务
            Db::commit();
            return true;
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            return false;
        }
    }
}